Program logics;

{ Программа строит таблицу истинности логического выражения от 5 логических переменных 
  и считает сколько комбинаций значений переменных приводят к истинности выражения }

var c,i: integer; { Количество подходящих комбинаций и переменная основного цикла }
var m,n,l,j,k,e: boolean; { Логические переменные — аргументы и переменная для хранения
  результата вычислений выражения }

function expression(m,n,l,j,k:boolean):boolean;	{ Здесь задается логическое выражение }
begin
	expression := ( (j and not k) or (m and n and l) )
				and ( (not (j and k)) or (not (m and n and l)) )
				and  ( not m or j);
end;

begin
	writeln('mnljk -> e'); { Заголовок таблицы истинности }
	c := 0; 
	for i := 0 to 31 do begin
		{ Каждой логической переменной соответствует свой двоичный разряд, выделяемый
		  посредством побитовых операций }
		m := boolean(i and 1);
		n := boolean((i and 2) div 2);
		l := boolean((i and 4) div 4);
		j := boolean((i and 8) div 8);
		k := boolean((i and 16) div 16);
		
		e := expression(m,n,l,j,k);
		
		if (e) then c := c + 1;
		
		{ При приведении к целому типу, печатается 1/0 вместо TRUE/FALSE, что улучшает
		  читаемость текста }
		  
		writeln(integer(m),integer(n),integer(l),integer(j),integer(k),' -> ',integer(e));
	end;
	writeln('Найдено  ', c, ' подходящих вариантов');
end.
